package it.saga.pes.frontoffice.servizi.struts2.step;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.interceptor.SessionAware;
import org.apache.struts2.interceptor.validation.SkipValidation;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.Preparable;
import com.opensymphony.xwork2.validator.annotations.VisitorFieldValidator;

@SuppressWarnings("serial")
@Namespace(value = "/step")

public class SessionStepAction extends ActionSupport implements SessionAware , Preparable {
	
	private static final Log log = LogFactory.getLog(SessionStepAction.class);
	private static final String STEP = "STEP";
	private static final String PRATICA = "PRATICA";
	private static String LISTA_ALLEGATI = "LISTA_ALLEGATI";
	
	public Integer step;
	
	private Pratica pratica = null;
	
	private ArrayList<Prodotto> listaProdotti;
	private ArrayList<ChiaveValore> listaTipoPagamento;
	
	public ArrayList<ChiaveValore> getListaTipoPagamento() {
		return listaTipoPagamento;
	}

	public ArrayList<Prodotto> getListaProdotti() {
		return listaProdotti;
	}
	
	private Map<String, Object> session ;
	
	@Override
	public void setSession(Map<String, Object> session) {
        this.session = session ;
    }
	
	@Override
	public void prepare() throws Exception {
		step = (Integer) session.get(STEP);
		pratica = (Pratica) session.get(PRATICA);
		listaProdotti = new ArrayList<Prodotto>();
		listaProdotti.add(new Prodotto("a1", "Pollo Fritto",10.00));
		listaProdotti.add(new Prodotto("b1", "Insalata",5.60));
		listaProdotti.add(new Prodotto("c2", "Hamburger",4.50));
		listaTipoPagamento = new ArrayList<ChiaveValore>();
		listaTipoPagamento.add(new ChiaveValore("rid","Rid"));
		listaTipoPagamento.add(new ChiaveValore("cc","CC"));
		listaTipoPagamento.add(new ChiaveValore("pp","Paypal"));
		listaTipoPagamento.add(new ChiaveValore("ccr","Carta di credito"));
	}

	@VisitorFieldValidator
	public Pratica getPratica() {
		return pratica;
	}

	public void setPratica(Pratica pratica) {
		this.pratica = pratica;
	}
	
	@Action(value = "step-0" , results={
			@Result(name = "avanti", location = "/step/step-1.jsp"),
			@Result(name = "input", location = "/step/step-0.jsp")
	})
	public String step0() {
		step=0;
		log.debug("step-"+step+" action");
		log.debug("from step :" + step);
		log.debug("to step :" + step);
		log.debug("pratica :" + pratica);
		session.put(STEP,step);
		session.put(PRATICA, pratica);
		return SUCCESS;
	}
	
	@Action(value = "step-1" , results={
			@Result(name = "avanti", location = "/step/step-2.jsp"),
			@Result(name = "indietro", location = "/step/step-0.jsp"),
			@Result(name = "input", location = "/step/step-0.jsp")
	})
	public String step1() {
		step=1;
		log.debug("step-"+step+" action");
		log.debug("from step :" + step);
		log.debug("to step :" + step);
		log.debug("pratica :" + pratica);
		session.put(STEP,step);
		session.put(PRATICA, pratica);
		return SUCCESS;
	}
	
	@SkipValidation
	@Action(value = "step-1-reload" , results={
			@Result(name = "success", location = "/step/step-1.jsp"),
			@Result(name = "input", location = "/step/step-1.jsp")
	})
	public String step1Reload() {
		if(pratica.getProdotto()!=null){
		String codice = pratica.getProdotto().getCodice();
			pratica.getProdotto().setDescrizione("");
			pratica.getProdotto().setPrezzo(null);
			for(Prodotto p :listaProdotti){
				if (p.getCodice().equals(codice)){
					pratica.getProdotto().setDescrizione(p.getDescrizione());
					pratica.getProdotto().setPrezzo(p.getPrezzo());
					break;
				}
			}
		}
		session.put(PRATICA, pratica);
		return SUCCESS;
	}
	
	@Action(value = "step-2" , results={
			@Result(name = "avanti", location = "/step/step-3.jsp"),
			@Result(name = "indietro", location = "/step/step-1.jsp"),
			@Result(name = "input", location = "/step/step-1.jsp")
	})
	public String step2() {
		step=2;
		log.debug("step-"+step+" action");
		log.debug("from step :" + step);	
		log.debug("to step :" + step);
		log.debug("pratica :" + pratica);
		session.put(STEP,step);
		session.put(PRATICA, pratica);
		return SUCCESS;
	}
	
	@SkipValidation
	@Action(value = "step-2-reload" , results={
			@Result(name = "success", location = "/step/step-2.jsp"),
			@Result(name = "input", location = "/step/step-2.jsp")
	})
	public String step2Reload() {
		if(pratica.getPagamento()!=null){
		String codice = pratica.getPagamento().getTipo();
			pratica.getPagamento().setTipo("");
			pratica.getPagamento().setDescrizione("");
			for(ChiaveValore cv :listaTipoPagamento){
				if (cv.getChiave().equals(codice)){
					pratica.getPagamento().setTipo(cv.getChiave());
					pratica.getPagamento().setDescrizione(cv.getValore());
					break;
				}
			}
		}
		session.put(PRATICA, pratica);
		return SUCCESS;
	}
	
	@Action(value = "step-upload" , results={
			@Result(name = "success", location="/upload/UploadList",  type="redirect", params = {"nextStep" ,"/step/step-3","backStep" ,"/step/step-2"} ) 
	})
	public String stepUpload() {
		return SUCCESS;
	}
	
	@Action(value = "step-3" , results={
			@Result(name = "indietro", location = "/step/step-2.jsp"),
			@Result(name = "input", location = "/step/step-2.jsp"),
			@Result(name = "avanti", location = "/step/step-end.jsp")
	})
	public String step3() {
		step=3;
		log.debug("step-"+step+" action");
		log.debug("from step :" + step);
		log.debug("to step :" + step);
		log.debug("pratica :" + pratica);
		pratica.setAllegati((List<Allegato>) session.get(LISTA_ALLEGATI));
		session.put(STEP,step);
		session.put(PRATICA, pratica);
		return SUCCESS;
	}
	
	@Action(value = "step-end" )
	public String end() {
		session.clear();
		return SUCCESS;
	}
	
	@SkipValidation
	@Action(value = "init", results = { @Result(name = "success", location = "/step/step-0.jsp") })
	public String init() {
		step = 0;
		session.put(STEP,step);
		session.put(PRATICA,new Pratica());
		return SUCCESS;
	}

}
